package source;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import java.net.InetAddress;
import java.net.Socket;


public class Cliente {

	// *************** <Atributos> ***************
	
	public String direccionIp; // Direccion Ip del cliente
	public String nombre; // Nombre del cliente

	public Socket servidorSocket; // Socket del Servidor


	
	// *************** <Constructor> ***************
	
	public Cliente(String nombreCliente, String direccionIpDelServidor, int port) {

		// Indicamos el nombre que usara el cliente
		nombre = nombreCliente;

		// Obtenemos la direccion IP del cliente y la almacenamos
		try
		{ 
			direccionIp = InetAddress.getLocalHost().getHostAddress();
		}
		catch (Exception e)
		{ 
			System.out.println("Excepcion: No puedo obtener la direccion IP local"); 
		}
		
		try
		{
			// Obtenemos el Socket del servidor, por lo tanto debemos indiciar
			// en que direccion esta el servidor y que puerto
			servidorSocket = new Socket(direccionIpDelServidor,port);
		}
		catch(Exception e)
		{
			System.out.println("Excepcion: No se pudo obtener el socket del servidor"); 
		}
	}
	
	public Cliente(String nombreCliente, Socket socketDelServidor) {
		
		// Indicamos el nombre que usara el cliente
		nombre = nombreCliente;
		
		// Obtenemos la direccion IP del cliente y la almacenamos
		try
		{ 
			direccionIp = InetAddress.getLocalHost().getHostAddress();
		}
		catch (Exception e)
		{ 
			System.out.println("Excepcion: No puedo obtener la direccion IP local"); 
		}
		
		servidorSocket = socketDelServidor;
	}
	
	// *************** <Consultas> ***************
	
	public String getDireccionIp() {
		return direccionIp;
	}

	public String getNombre() {
		return nombre;
	}	

	public Socket getSocketDelServidor() {
		return servidorSocket;
	}


	// *************** <Comandos> ***************
	

	public void enviarMensaje(Mensaje m) {
		
		ObjectOutputStream datosSalida;
		
		try
		{
			// Creamos un flujo de datos con el Socket del Servidor
			datosSalida = new ObjectOutputStream(servidorSocket.getOutputStream());
			// Escribimos el mensaje en el flujo de datos
			datosSalida.writeObject(m);
		}
		catch (Exception e)
		{
			System.out.println("Excepcion: Problema con crear el Flujo o enviar los datos :: " + e);
		}
	}
	
	public Mensaje recibirMensaje(){
		
		ObjectInputStream datos_entrada;
		
		try
		{
			if (servidorSocket.getInputStream().available() != 0)
			{
				// Buscamos en el canal de salida del Servidor por si envio algun mensaje
				datos_entrada = new ObjectInputStream(servidorSocket.getInputStream());
				// Si es asi lo retornamos, debi especificar con un CAST que el objeto que estamos
				// por recibir va a ser de tipo Mensaje
				return (Mensaje) datos_entrada.readObject();
			}
			else
			{
				return null;
			}
		}
		catch (Exception e)
		{
			System.out.println("Excepcion: Problema con recibir datos o leer el Flujo de entrada :: " + e);
			return null;
		}
	}
	

}
